package review.Day_0508;

/**
 * @author zxc
 * @date 2023/05/08 22:05
 **/

import java.util.HashMap;
import java.util.Map;

/**
 * 题目 ：数青蛙
 * 题目详述 ：
 * 给你一个字符串 croakOfFrogs，它表示不同青蛙发出的蛙鸣声（字符串 "croak" ）的组合。
 * 由于同一时间可以有多只青蛙呱呱作响，所以croakOfFrogs 中会混合多个 “croak” 。
 * 请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
 * 要想发出蛙鸣 "croak"，青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。
 * 如果没有输出全部五个字母，那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成，请返回 -1 。
 *
 * 提示：
 * 1 <= croakOfFrogs.length <= 105
 * 字符串中的字符只有 'c', 'r', 'o', 'a' 或者 'k'
 *
 */
public class MinNumberOfFrogs {
    // 即，使用hashmap，来记录当前字符所对应的前一个字符;
    private static Map<Character , Character> hashmap = new HashMap<>();
    static {
        String str = "croakc";
        char[] array = str.toCharArray();
        for(int i = 1 ; i < array.length ; i++){
            hashmap.put(array[i] , array[i - 1]);
        }
    }
    public int minNumberOfFrogs(String croakOfFrogs) {
        // 用来统计(处于叫完某个字符后状态的青蛙数量);
        Map<Character , Integer> map = new HashMap<>();
        for (char ch : croakOfFrogs.toCharArray()) {
            Character c = hashmap.get(ch);
            // 所遍历的字符ch的前一个字符c，在map中数量 > 0，说明有青蛙处于正要叫的状态;
            if(map.getOrDefault(c , 0) > 0){
                map.put(c , map.get(c) - 1);
            }
            // 前一个字符c为 0（即，随时准备叫字符ch的青蛙数量为0） && 同时，当前遍历字符ch不是青蛙叫的起始字符'c';
            else if(ch != 'c'){
                return -1;
            }
            map.put(ch , map.getOrDefault(ch , 0) + 1);
        }
        // 遍历完字符串croakOfFrogs后，
        if(map.getOrDefault('c' , 0) > 0 || map.getOrDefault('r' , 0) > 0
                || map.getOrDefault('o' , 0) > 0 || map.getOrDefault('a' , 0) > 0){
            return -1;
        }
        return map.get('k');

    }
}
